package com.center.growcenterserver.common;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Date;


/**
 * JwtUtils 类提供了一组用于生成和验证 JSON Web Tokens (JWT) 的静态方法。
 * JWT 是一种开放标准 (RFC 7519)，用于在双方之间安全地传输信息作为令牌。
 *
 * 主要功能包括：
 * - 生成带有指定主题（subject）的 JWT，该 JWT 将在一段时间后过期。
 * - 解析 JWT 获取其中包含的信息（声明）。
 * - 验证 JWT 是否已经过期。
 *
 * 注意：此实现使用了 HS512 签名算法来保证 JWT 的完整性和真实性。
 */

public class JwtUtils {
//    public static final String SECRET_KEY = "234ffsdfq332dsfsf";

    // 生成512位的密钥
    static byte[] keyBytes = Keys.secretKeyFor(SignatureAlgorithm.HS512).getEncoded();
    public static final Key SECRET_KEY = new SecretKeySpec(keyBytes, SignatureAlgorithm.HS512.getJcaName());

    // 过期时间，单位为秒
    private static final long EXPIRATION_TIME = 7 * 24 * 60 * 60; // 7天

    //生成 JWT   subject 用户信息
    public static String generateToken(String subject) {
        // 计算过期时间
        Date expirationDate = new Date(System.currentTimeMillis() + EXPIRATION_TIME * 1000);
        String jwt = Jwts.builder()
                .setSubject(subject)
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS512, keyBytes)
                .compact();
        return jwt;
    }

    //解析 JWT
    public static Claims parseToken(String jwt) {
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }

    //验证JWT是否过期
    public static boolean isTokenExpired(String jwt) {
        try {
            Claims claims = parseToken(jwt);
            Date expirationDate = claims.getExpiration();
            return expirationDate.before(new Date());
        } catch (Exception e) {
            //过期会抛异常，所以直接捕捉  返回ture代表已过期
            throw new ExpiredJwtException(null, null, "Token已经过期");
            //return true;
        }
    }

    //临时测试
    public static void main(String[] args) {
        //加密生成token字符串
        String token = generateToken("huel");
        System.out.println(token);
        //解密
        //token = "chgpT8t-yoFN3r_L6MeeJFTuSHCzmVQ";
        System.out.println(parseToken(token));
        //判断是否过期
        System.out.println(isTokenExpired(token));
    }
}